package controller

import (
	"gitee.com/zhoulvvv/my_go_gateway/dto"
	"gitee.com/zhoulvvv/my_go_gateway/middleware"
	"gitee.com/zhoulvvv/my_go_gateway/services"
	"github.com/gin-gonic/gin"
)

type AppController struct {
	AppSvc *services.AppService
}

func RegisterAppController(router *gin.RouterGroup) {
	app := AppController{}
	appService, err := services.NewAppService()
	if err != nil {
		panic("租户Service初始化失败：" + err.Error())
	}
	app.AppSvc = appService
	router.GET("/app_list", app.AppList)
	router.GET("/app_detail", app.AppDetail)
	router.GET("/app_stat", app.AppStat)
	router.GET("/app_delete", app.AppDelete)
	router.POST("/app_add", app.AppAdd)
	router.POST("/app_update", app.AppUpdate)
}

// AppList godoc
// @Summary 租户列表
// @Description 租户列表
// @Tags 租户管理
// @ID /app/app_list
// @Accept  json
// @Produce  json
// @Param info query string false "关键词"
// @Param page_no query int true "页码"
// @Param page_size query int true "每页数量"
// @Success 200 {object} middleware.Response{data=dto.AppListOutput} "success"
// @Router /app/app_list [get]
func (a *AppController) AppList(c *gin.Context) {
	params := &dto.AppListInput{}
	if err := params.BindValidaParam(c); err != nil {
		middleware.ResponseError(c, 4000, err)
		return
	}
	outList, err := a.AppSvc.GetAppList(c, params)
	if err != nil {
		middleware.ResponseError(c, 4000, err)
		return
	}
	middleware.ResponseSuccess(c, outList)
}

// AppDetail godoc
// @Summary 租户详情
// @Description 租户详情
// @Tags 租户管理
// @ID /app/app_detail
// @Accept  json
// @Produce  json
// @Param id query int true "租户Id"
// @Success 200 {object} middleware.Response{data=dao.App} "success"
// @Router /app/app_detail [get]
func (a *AppController) AppDetail(c *gin.Context) {
	params := &dto.AppDetailInput{}
	if err := params.BindValidaParam(c); err != nil {
		middleware.ResponseError(c, 4000, err)
		return
	}
	appDetail, err := a.AppSvc.GetAppDetail(c, params)
	if err != nil {
		middleware.ResponseError(c, 4000, err)
		return
	}
	middleware.ResponseSuccess(c, appDetail)
}

// AppStat godoc
// @Summary 租户统计
// @Description 租户统计
// @Tags 租户管理
// @ID /app/app_stat
// @Accept  json
// @Produce  json
// @Param id query int true "租户Id"
// @Success 200 {object} middleware.Response{data=dto.StatisticsOutput} "success"
// @Router /app/app_stat [get]
func (a *AppController) AppStat(c *gin.Context) {
	params := &dto.AppDetailInput{}
	if err := params.BindValidaParam(c); err != nil {
		middleware.ResponseError(c, 4000, err)
		return
	}
	stat, err := a.AppSvc.AppStat(c, params)
	if err != nil {
		middleware.ResponseError(c, 4000, err)
		return
	}
	middleware.ResponseSuccess(c, stat)
}

// AppDelete godoc
// @Summary 租户删除
// @Description 租户删除
// @Tags 租户管理
// @ID /app/app_delete
// @Accept  json
// @Produce  json
// @Param id query int true "租户Id"
// @Success 200 {object} middleware.Response{data=string} "success"
// @Router /app/app_delete [get]
func (a *AppController) AppDelete(c *gin.Context) {
	params := &dto.AppDetailInput{}
	if err := params.BindValidaParam(c); err != nil {
		middleware.ResponseError(c, 4000, err)
		return
	}
	err := a.AppSvc.AppDelete(c, params)
	if err != nil {
		middleware.ResponseError(c, 4000, err)
		return
	}
	middleware.ResponseSuccess(c, "租户删除成功")
}

// AppAdd godoc
// @Summary 租户添加
// @Description 租户添加
// @Tags 租户管理
// @ID /app/app_add
// @Accept  json
// @Produce  json
// @Param body body dto.AppAddInput true "body"
// @Success 200 {object} middleware.Response{data=string} "success"
// @Router /app/app_add [post]
func (a *AppController) AppAdd(c *gin.Context) {
	params := &dto.AppAddInput{}
	if err := params.BindValidaParam(c); err != nil {
		middleware.ResponseError(c, 4000, err)
		return
	}
	err := a.AppSvc.AppAdd(c, params)
	if err != nil {
		middleware.ResponseError(c, 4000, err)
		return
	}
	middleware.ResponseSuccess(c, "租户成功添加")
}

// AppUpdate godoc
// @Summary 租户修改
// @Description 租户修改
// @Tags 租户管理
// @ID /app/app_update
// @Accept  json
// @Produce  json
// @Param body body dto.AppUpdateInput true "body"
// @Success 200 {object} middleware.Response{data=string} "success"
// @Router /app/app_update [post]
func (a *AppController) AppUpdate(c *gin.Context) {
	params := &dto.AppUpdateInput{}
	if err := params.BindValidaParam(c); err != nil {
		middleware.ResponseError(c, 4000, err)
		return
	}
	err := a.AppSvc.AppUpdate(c, params)
	if err != nil {
		middleware.ResponseError(c, 4000, err)
		return
	}
	middleware.ResponseSuccess(c, "租户成功修改")
}
